package dell.yangzhou01;

import dell.yangzhou.Employee;

import java.util.ArrayList;
import java.util.Arrays;
import java.util.List;
import java.util.stream.Stream;

//测试Stream中间操作
public class StreamAPITest1 {
    public static void main(String[] args) {
        //1.筛选与切片
        List<Employee> list = EmployeeData.getEmployees();
        //先创建stream（）
        Stream<Employee> stream = list.stream();
        //例：查询员工表中薪资大于70000的员工数据信息
        stream.filter(employee -> employee.getSalary()>70000).forEach(System.out::println);
        System.out.println("===============");

        //此时因为上面已经生成了结果，就必须再生成一个新的stream才能使用（list.stream()）
       //注意此处生成新的stream（）的代码很简单，不需要再new一个对象了
        list.stream().limit(3).forEach(System.out::println);

        System.out.println("===============");
        //跳过元素
        list.stream().skip(2).forEach(System.out::println);
        System.out.println("=============");
        //去除重复元素
        list.add(new Employee(1010,"刘一同",20,66600));
        list.add(new Employee(1010,"刘一同",20,66600));
        list.add(new Employee(1010,"刘一同",20,66600));
        list.add(new Employee(1010,"刘一同",20,66600));
        //此时使用list集合，是可以存储重复元素的
        list.stream().distinct().forEach(System.out::println);
        System.out.println("===================");
        //2.映射(map)
        //例，将小写字母转换为大写字母
        List<String>list1= Arrays.asList("aa","bb","cc","dd");
        list1.stream().map(str->str.toUpperCase()).forEach(System.out::println);
        System.out.println("===================");
//练习：获取员工姓名长度大于3的员工的姓名
        List<Employee>list2=EmployeeData.getEmployees();
        Stream<String> stringStream = list2.stream().map(Employee::getName);
        stringStream.filter(name->name.length()>3).forEach(System.out::println);
        System.out.println("==================");

        ArrayList list3=new ArrayList();
        list3.add(1);
        list3.add(2);
        list3.add(3);
        ArrayList list4=new ArrayList();
        list4.add(4);
        list4.add(5);
        list4.add(6);
        list3.add(list4);
        System.out.println(list3);
        //[1, 2, 3, [4, 5, 6]]（一共四个元素，map（）与之效果类似）
        list3.addAll(list4);
        System.out.println(list3);
        //[1, 2, 3, [4, 5, 6], 4, 5, 6](有打散的效果，flatMap（）与之效果类似)

        //练习
        //方法一：【尽量别用，难呀】
        Stream<Stream<Character>> streamStream =
                list1.stream().map(StreamAPITest1::fromStringToStream);
        streamStream.forEach(s->{
            s.forEach(System.out::print);
            //aabbccdd
        });
        //相当于两层嵌套的for循环，这样可以将[1, 2, 3, [4, 5, 6]]
        //中的[4, 5, 6]再拆分开，得到{1,2,3,4,5,6}
        //方法二：【推荐使用】
        list1.stream().flatMap(StreamAPITest1::fromStringToStream).forEach(System.out::print);
        //aabbccdd
        System.out.println("=============================");
        //3.排序
        //（1）自然排序
        List<Integer>list5=Arrays.asList(12,78,0,10,7,-1,3);
        list5.stream().sorted().forEach(System.out::println);
        //默认升序。【注意】自然排序要给Employee类型排序时，必须实现Comparator接口
        //来指定相关的排序标准，否则以上面的自然排序直接运行会出异常
        //（2）定制排序
        List<Employee>employees=EmployeeData.getEmployees();
        employees.stream().sorted((e1,e2)->{
            int ageValue = Integer.compare(e1.getAge(), e2.getAge());
            //以年龄为比较标准
            if (ageValue!=0){
                return ageValue;
            }else {
                return -Integer.compare(e1.getSalary(),e2.getSalary());
                //年龄相等时以收入作为比较标准且降序
            }
        }).forEach(System.out::println);
    }
    //方法作用：将字符串中的多个字符构成的集合转换为对应的Stream的实例
    public static Stream<Character>fromStringToStream(String str){
        ArrayList<Character>list=new ArrayList<>();
        for (Character c:str.toCharArray()){
            list.add(c);
        }
        return list.stream();
    }
}
